﻿/**
 * jQuery ligerUI 1.1.9
 * 
 * http://ligerui.com
 * 
 * Author daomi 2012 [ gd_star@163.com ]
 * 
 */
(function($) {
	$.fn.ligerSpinner = function() {
		return $.ligerui.run.call(this, "ligerSpinner", arguments);
	};
	$.fn.ligerGetSpinnerManager = function() {
		return $.ligerui.run.call(this, "ligerGetSpinnerManager", arguments);
	};

	$.ligerDefaults.Spinner = {
		type : 'float', // 类型 float:浮点数 int:整数 time:时间
		isNegative : true, // 是否负数
		decimalplace : 2, // 小数位 type=float时起作用
		step : 0.1, // 每次增加的值
		interval : 50, // 间隔，毫秒
		onChangeValue : false, // 改变值事件
		minValue : null, // 最小值
		maxValue : null, // 最大值
		disabled : false
	};

	$.ligerMethos.Spinner = {};

	$.ligerui.controls.Spinner = function(element, options) {
		$.ligerui.controls.Spinner.base.constructor
				.call(this, element, options);
	};
	$.ligerui.controls.Spinner.ligerExtend($.ligerui.controls.Input, {
		__getType : function() {
			return 'Spinner';
		},
		__idPrev : function() {
			return 'Spinner';
		},
		_extendMethods : function() {
			return $.ligerMethos.Spinner;
		},
		_init : function() {
			$.ligerui.controls.Spinner.base._init.call(this);
			var p = this.options;
			if (p.type == 'float') {
				p.step = 0.1;
				p.interval = 50;
			} else if (p.type == 'int') {
				p.step = 1;
				p.interval = 100;
			} else if (p.type == 'time') {
				p.step = 1;
				p.interval = 100;
			}
		},
		_render : function() {
			var g = this, p = this.options;
			g.interval = null;
			g.inputText = null;
			g.value = null;
			g.textFieldID = "";
			if (this.element.tagName.toLowerCase() == "input"
					&& this.element.type && this.element.type == "text") {
				g.inputText = $(this.element);
				if (this.element.id)
					g.textFieldID = this.element.id;
			} else {
				g.inputText = $('<input type="text"/>');
				g.inputText.appendTo($(this.element));
			}
			if (g.textFieldID == "" && p.textFieldID)
				g.textFieldID = p.textFieldID;

			g.link = $('<div class="l-trigger"><div class="l-spinner-up"><div class="l-spinner-icon"></div></div><div class="l-spinner-split"></div><div class="l-spinner-down"><div class="l-spinner-icon"></div></div></div>');
			g.wrapper = g.inputText.wrap('<div class="l-text"></div>').parent();
			g.wrapper
					.append('<div class="l-text-l"></div><div class="l-text-r"></div>');
			g.wrapper.append(g.link).after(g.selectBox).after(g.valueField);
			g.link.up = $(".l-spinner-up", g.link);
			g.link.down = $(".l-spinner-down", g.link);
			g.inputText.addClass("l-text-field");

			if (p.disabled) {
				g.wrapper.addClass("l-text-disabled");
			}
			// 初始化
			if (!g._isVerify(g.inputText.val())) {
				g.value = g._getDefaultValue();
				g.inputText.val(g.value);
			}
			// 事件
			g.link.up.hover(function() {
						if (!p.disabled)
							$(this).addClass("l-spinner-up-over");
					}, function() {
						clearInterval(g.interval);
						$(document).unbind("selectstart.spinner");
						$(this).removeClass("l-spinner-up-over");
					}).mousedown(function() {
						if (!p.disabled) {
							g._uping.call(g);
							g.interval = setInterval(function() {
										g._uping.call(g);
									}, p.interval);
							$(document).bind("selectstart.spinner", function() {
										return false;
									});
						}
					}).mouseup(function() {
						clearInterval(g.interval);
						g.inputText.trigger("change").focus();
						$(document).unbind("selectstart.spinner");
					});
			g.link.down.hover(function() {
						if (!p.disabled)
							$(this).addClass("l-spinner-down-over");
					}, function() {
						clearInterval(g.interval);
						$(document).unbind("selectstart.spinner");
						$(this).removeClass("l-spinner-down-over");
					}).mousedown(function() {
						if (!p.disabled) {
							g.interval = setInterval(function() {
										g._downing.call(g);
									}, p.interval);
							$(document).bind("selectstart.spinner", function() {
										return false;
									});
						}
					}).mouseup(function() {
						clearInterval(g.interval);
						g.inputText.trigger("change").focus();
						$(document).unbind("selectstart.spinner");
					});

			g.inputText.change(function() {
						var value = g.inputText.val();
						g.value = g._getVerifyValue(value);
						g.trigger('changeValue', [g.value]);
						g.inputText.val(g.value);
					}).blur(function() {
						g.wrapper.removeClass("l-text-focus");
					}).focus(function() {
						g.wrapper.addClass("l-text-focus");
					});
			g.wrapper.hover(function() {
						if (!p.disabled)
							g.wrapper.addClass("l-text-over");
					}, function() {
						g.wrapper.removeClass("l-text-over");
					});
			g.set(p);
		},
		_setWidth : function(value) {
			var g = this;
			if (value > 20) {
				g.wrapper.css({
							width : value
						});
				g.inputText.css({
							width : value - 20
						});
			}
		},
		_setHeight : function(value) {
			var g = this;
			if (value > 10) {
				g.wrapper.height(value);
				g.inputText.height(value - 2);
				g.link.height(value - 4);
			}
		},
		_setDisabled : function(value) {
			if (value) {
				this.wrapper.addClass("l-text-disabled");
			} else {
				this.wrapper.removeClass("l-text-disabled");
			}
		},
		setValue : function(value) {
			this.inputText.val(value);
		},
		getValue : function() {
			return this.inputText.val();
		},
		_round : function(v, e) {
			var g = this, p = this.options;
			var t = 1;
			for (; e > 0; t *= 10, e--);
			for (; e < 0; t /= 10, e++);
			return Math.round(v * t) / t;
		},
		_isInt : function(str) {
			var g = this, p = this.options;
			var strP = p.isNegative ? /^-?\d+$/ : /^\d+$/;
			if (!strP.test(str))
				return false;
			if (parseFloat(str) != str)
				return false;
			return true;
		},
		_isFloat : function(str) {
			var g = this, p = this.options;
			var strP = p.isNegative ? /^-?\d+(\.\d+)?$/ : /^\d+(\.\d+)?$/;
			if (!strP.test(str))
				return false;
			if (parseFloat(str) != str)
				return false;
			return true;
		},
		_isTime : function(str) {
			var g = this, p = this.options;
			var a = str.match(/^(\d{1,2}):(\d{1,2})$/);
			if (a == null)
				return false;
			if (a[1] > 24 || a[2] > 60)
				return false;
			return true;

		},
		_isVerify : function(str) {
			var g = this, p = this.options;
			if (p.type == 'float') {
				if (!g._isFloat(str))
					return false;
				var value = parseFloat(str);
				if (p.minValue != undefined && p.minValue > value)
					return false;
				if (p.maxValue != undefined && p.maxValue < value)
					return false;
				return true;
			} else if (p.type == 'int') {
				if (!g._isInt(str))
					return false;
				var value = parseInt(str);
				if (p.minValue != undefined && p.minValue > value)
					return false;
				if (p.maxValue != undefined && p.maxValue < value)
					return false;
				return true;
			} else if (p.type == 'time') {
				return g._isTime(str);
			}
			return false;
		},
		_getVerifyValue : function(value) {
			var g = this, p = this.options;
			var newvalue = null;
			if (p.type == 'float') {
				newvalue = g._round(value, p.decimalplace);
			} else if (p.type == 'int') {
				newvalue = parseInt(value);
			} else if (p.type == 'time') {
				newvalue = value;
			}
			if (!g._isVerify(newvalue)) {
				return g.value;
			} else {
				return newvalue;
			}
		},
		_isOverValue : function(value) {
			var g = this, p = this.options;
			if (p.minValue != null && p.minValue > value)
				return true;
			if (p.maxValue != null && p.maxValue < value)
				return true;
			return false;
		},
		_getDefaultValue : function() {
			var g = this, p = this.options;
			if (p.type == 'float' || p.type == 'int') {
				return 0;
			} else if (p.type == 'time') {
				return "00:00";
			}
		},
		_addValue : function(num) {
			var g = this, p = this.options;
			var value = g.inputText.val();
			value = parseFloat(value) + num;
			if (g._isOverValue(value))
				return;
			g.inputText.val(value);
			g.inputText.trigger("change");
		},
		_addTime : function(minute) {
			var g = this, p = this.options;
			var value = g.inputText.val();
			var a = value.match(/^(\d{1,2}):(\d{1,2})$/);
			newminute = parseInt(a[2]) + minute;
			if (newminute < 10)
				newminute = "0" + newminute;
			value = a[1] + ":" + newminute;
			if (g._isOverValue(value))
				return;
			g.inputText.val(value);
			g.inputText.trigger("change");
		},
		_uping : function() {
			var g = this, p = this.options;
			if (p.type == 'float' || p.type == 'int') {
				g._addValue(p.step);
			} else if (p.type == 'time') {
				g._addTime(p.step);
			}
		},
		_downing : function() {
			var g = this, p = this.options;
			if (p.type == 'float' || p.type == 'int') {
				g._addValue(-1 * p.step);
			} else if (p.type == 'time') {
				g._addTime(-1 * p.step);
			}
		},
		_isDateTime : function(dateStr) {
			var g = this, p = this.options;
			var r = dateStr.match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/);
			if (r == null)
				return false;
			var d = new Date(r[1], r[3] - 1, r[4]);
			if (d == "NaN")
				return false;
			return (d.getFullYear() == r[1] && (d.getMonth() + 1) == r[3] && d
					.getDate() == r[4]);
		},
		_isLongDateTime : function(dateStr) {
			var g = this, p = this.options;
			var reg = /^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2}) (\d{1,2}):(\d{1,2})$/;
			var r = dateStr.match(reg);
			if (r == null)
				return false;
			var d = new Date(r[1], r[3] - 1, r[4], r[5], r[6]);
			if (d == "NaN")
				return false;
			return (d.getFullYear() == r[1] && (d.getMonth() + 1) == r[3]
					&& d.getDate() == r[4] && d.getHours() == r[5] && d
					.getMinutes() == r[6]);
		}
	});

})(jQuery);